package com.zyf.pattern.proxy.jdk;

import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;

/**
 * create by yifeng
 */
public class JDKProxyTest {
    public static void main(String[] args) throws Exception {
        Person instance = (Person) new JDKMeipo().getInstance(new ZhangSan());
        System.out.println("代理类" + instance.getClass());
        // 这个instance类已经不是ZhangSan了，而是动态代理自动生成的一个类
        instance.findLove();

        // 原理
        // 1. 拿到被代理对象的引用，并且获取到它的所有的接口，
        // 2. JDK Proxy 类重新生成一个新的类，同时新的类要实现被代理类所有的接口
        // 3. 动态生成java代码，把新加的业务逻辑方法由一定的逻辑代码去调用（在代码中体现）
        // 4. 编译新生成的java代码.class
        // 5. 再重新加载到JVM中运行

        // jDK中，只要是$开头的一般都是自动生成的
//        class com.sun.proxy.$Proxy0 0为编号

        // 通过反编译工具可以查看源代码
        byte[] bytes = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{Person.class});
        FileOutputStream os = new FileOutputStream("E://$Proxy0.class");
        os.write(bytes);
        os.close();



        System.out.println("-----开始找工作");
        Person instance2 = (Person) new JDK58().getInstance(new ZhangSan());
        instance2.findJob();
    }
}
